#include <iostream>
#include <string>

using namespace std;

class Solution 
{
public:

    string XADD(string stk, string tmp, int l)
    {
        /*if (stk.size() == 0 || tmp.size() == 0)
        {
            return { "0" };
        }*/
        if (stk.empty())
        {
            return tmp;
        }
        while (l--)
            tmp.insert(tmp.begin(), '0');

        if (stk.size() > tmp.size())
        {
            swap(stk, tmp);
        }

        int F = 0, i = 0;
        for (i = 0; i < tmp.size(); i++)
        {
            int t = 0;
            if (i < stk.size())
            {
                t = stk[i] - '0';
            }

            int a = tmp[i] + t + F - '0';
            tmp[i] = a % 10 + '0';
            F = a / 10;
        }
        if (F)
            tmp += F + '0';

        return tmp;
    }

    string multiply(string num1, string num2) 
    {
        if (num1 == "0" || num2 == "0") 
            return "0";

        if (num1.size() > num2.size())
        {
            swap(num1, num2);
        }

        string stk;
        string tmp;
        int i = num1.size()-1;
        int l = 0;
        int F = 0;
        while (i >= 0)
        {
            int a = num1[i--] - '0';
            int j = num2.size() - 1;
            tmp.clear();
            F = 0;
            while (j >= 0)
            {
                int b = num2[j--] - '0';
                char sum = (a * b + F) % 10 + '0';
                
                tmp.push_back(sum);
                F = (a * b + F) / 10;

            }
            if (F)
                tmp.insert(tmp.end(), F + '0');
            stk = XADD(stk, tmp, l++);
        }

        return { stk.rbegin(), stk.rend() };
    }
};

//class Solution 
//{
//public:
//    string multiply(string num1, string num2) 
//    {
//        int n1 = stoi(num1);
//        int n2 = stoi(num2);
//
//        long long n = n1 * n2;
//
//        string s = to_string(n);
//        return s;
//    }
//};

int main()
{
    string num1{ "123" };
    string num2{ "456" };

    Solution xz;

    /*string s1{ "207" };
    string s2{ "639" };*/


    //string s = xz.XADD(s1, s2);

    string s = xz.multiply(num1, num2);
    cout << s << endl;

    

	return 0;
}

